home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / x11 / rpg / crossfir.001 / crossfir~ / eutl / dynarray / dynarray.c next >
C/C++ Source or Header  |  1994-10-15  |  2KB  |  78 lines

  1. #define __eutl_dynarray_impl
  2. #include "dynarray.h"
  3. #include <xmalloc.h>
  4. #include <stdio.h>
  5. #include <libc.h>
  6.  
  7. char *dynarray_packagever = "DynArray V1.0";
  8. char *dynarray_Ebadisize = "0 is a bad item size";
  9. char *dynarray_Eoutofbounds = "Array index out of bounds";
  10.  
  11. struct __eutl_dynarray_DynArray {
  12.   void *a;/* array */
  13.   unsigned int amax,asize,aincr,isize;/* maximum assigned index of array,
  14.                      current actual size of array,
  15.                      array size increment for resizing set,
  16.                      item size */
  17. };
  18.  
  19. static ErrorFunction Erf = LongJmpErrorFunction;
  20.  
  21. eutl_dynarray_DynArray eutl_dynarray_dyn_create(unsigned int isize,
  22.                   unsigned int inum,
  23.                   unsigned int iincr)
  24. {
  25.   eutl_dynarray_DynArray ret;
  26.  
  27.   if (isize==0)
  28.     Erf(dynarray_packagever,dynarray_Ebadisize,
  29.     "Item size of 0 is illegal\n");
  30.  
  31.   if (iincr==0) {
  32.     iincr = EUTL_DYNARRAY_MEMCHUNK/isize;
  33.     if ( iincr < EUTL_DYNARRAY_MININCR )
  34.       iincr = EUTL_DYNARRAY_MININCR;
  35.   }
  36.   if (inum==0) 
  37.     inum = iincr;
  38.   ret = xmalloc(sizeof(struct __eutl_dynarray_DynArray));
  39.   ret->amax = 0;
  40.   ret->asize = 0;
  41.   ret->aincr = iincr;
  42.   ret->isize = isize;
  43.   ret->a = NULL;
  44.   return ret;
  45. }
  46.  
  47. void eutl_dynarray_dyn_destroy(eutl_dynarray_DynArray gone)
  48. {
  49.   free(gone->a);
  50.   free(gone);
  51. }
  52.  
  53. void eutl_dynarray_dyn_set(eutl_dynarray_DynArray array,
  54.                unsigned int index,
  55.                void *iptr)
  56. {
  57.   if (array->amax <= index) {
  58.     /* set amax to be the multiple of aincr right above index */
  59.     array->amax = index - (index % array->aincr) + array->aincr;
  60.     array->a = xrealloc(array->a,array->amax*array->isize);
  61.   }
  62.   /* copy in the data */
  63.   bcopy(iptr,(char *)array->a + index * array->isize,array->isize);
  64.   if (array->asize <= index)
  65.     array->asize = index+1;
  66. }
  67.  
  68. void *eutl_dynarray_dyn_get(eutl_dynarray_DynArray array,
  69.                unsigned int index)
  70. {
  71.   if (array->asize <= index)
  72.     Erf(dynarray_packagever,dynarray_Eoutofbounds,
  73.     "Index %d is out of bounds, max set array size is %d\n",
  74.     index,array->asize);
  75.   return (void *)((char *)array->a + index * array->isize);
  76. }
  77.  
  78.